[IA64] Fix HVM interrupts on IPF
authorawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Mon, 13 Nov 2006 18:02:37 +0000 (11:02 -0700)
committerawilliam@xenbuild.aw <awilliam@xenbuild.aw>
Mon, 13 Nov 2006 18:02:37 +0000 (11:02 -0700)
Xen has changed to set-irq-level hypercall from shared-memory PIC stat.
This patch makes IPF accomodate this change

Signed-off-by: Anthony Xu <anthony.xu@intel.com>
linux-2.6-xen-sparse/arch/ia64/xen/xcom_privcmd.c
xen/arch/ia64/vmx/vlsapic.c
xen/arch/ia64/vmx/vmx_hypercall.c
xen/include/asm-ia64/vmx.h
xen/include/asm-ia64/vmx_platform.h

index ad1737c5b93892ef10c3b6654dce33e8debaf8ad..51cbb9f4c076c8513bbc344c777c3658c4a59e35 100644 (file)
@@ -579,6 +579,9 @@ xencomm_privcmd_hvm_op(privcmd_hypercall_t *hypercall)
        case HVMOP_set_param:
                argsize = sizeof(xen_hvm_param_t);
                break;
+       case HVMOP_set_irq_level:
+               argsize = sizeof(xen_hvm_set_irq_level_t);
+               break;
        default:
                printk("%s: unknown HVMOP %d\n", __func__, cmd);
                return -EINVAL;
index 5594e52f70b4fb5dfdf7e4934f2b8d1f26140603..3a6d85a36a56c94197d7203df9797d620a2d8ed7 100644 (file)
@@ -666,3 +666,25 @@ void vmx_vexirq(VCPU *vcpu)
 {
     generate_exirq (vcpu);
 }
+
+
+void vmx_vioapic_set_irq(struct domain *d, int irq, int level)
+{
+    unsigned long flags;
+
+    spin_lock_irqsave(&d->arch.arch_vmx.virq_assist_lock, flags);
+    vioapic_set_irq(d, irq, level);
+    spin_unlock_irqrestore(&d->arch.arch_vmx.virq_assist_lock, flags);
+}
+
+int vmx_vlapic_set_irq(VCPU *v, uint8_t vec, uint8_t trig)
+{
+    int ret;
+    int running = test_bit(_VCPUF_running, &v->vcpu_flags);
+
+    ret = vmx_vcpu_pend_interrupt(v, vec);
+    vcpu_unblock(v);
+    if (running)
+        smp_send_event_check_cpu(v->processor);
+    return ret;
+}
index 2252ad6401802d242bfb88f8ac771dd6610872c9..dcb571e042bf065be17f3fe2cdbc1538feb9b913 100644 (file)
@@ -34,6 +34,7 @@
 #include <public/version.h>
 #include <asm/dom_fw.h>
 #include <xen/domain.h>
+#include <asm/vmx.h> 
 
 long
 do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) arg)
@@ -78,6 +79,31 @@ do_hvm_op(unsigned long op, XEN_GUEST_HANDLE(void) arg)
         break;
     }
 
+    case HVMOP_set_irq_level:
+    {
+        struct xen_hvm_set_irq_level op;
+        struct domain *d;
+
+        if (copy_from_guest(&op, arg, 1))
+            return -EFAULT;
+
+        if (!IS_PRIV(current->domain))
+            return -EPERM;
+
+        d = find_domain_by_id(op.domid);
+        if (d == NULL)
+            return -ESRCH;
+
+        rc = -EINVAL;
+        if (is_hvm_domain(d)) {
+            vmx_vioapic_set_irq(d, op.irq, op.level);
+            rc = 0;
+        }
+
+        put_domain(d);
+        break;
+    }
+
     default:
         gdprintk(XENLOG_INFO, "Bad HVM op %ld.\n", op);
         rc = -ENOSYS;
index 4e0971278a70f640225ee14ed97e273056a92d7c..344ef44b9587125d88d302de884f19729e2d7707 100644 (file)
@@ -55,6 +55,7 @@ extern void vmx_relinquish_guest_resources(struct domain *d);
 extern void vmx_relinquish_vcpu_resources(struct vcpu *v);
 extern void vmx_die_if_kernel(char *str, struct pt_regs *regs, long err);
 extern void vmx_send_assist_req(struct vcpu *v);
+extern void vmx_vioapic_set_irq(struct domain *d, int irq, int level);
 
 static inline vcpu_iodata_t *get_vio(struct domain *d, unsigned long cpu)
 {
index 7239fd1793bde9dac94f98cb752bbc0c2cf04d53..878961ef0413505e038e646342e3e2ea30fe3951 100644 (file)
@@ -56,10 +56,10 @@ extern uint64_t dummy_tmr[];
 #define VLAPIC_ID(l) (uint16_t)(((l)->vcpu->arch.privregs->lid) >> 16)
 #define VLAPIC_IRR(l) ((l)->vcpu->arch.privregs->irr[0])
 struct vlapic *apic_round_robin(struct domain *d, uint8_t vector, uint32_t bitmap);
-extern int vmx_vcpu_pend_interrupt(struct vcpu *vcpu, uint8_t vector);
+extern int vmx_vlapic_set_irq(struct vcpu *v, uint8_t vec, uint8_t trig);
 static inline int vlapic_set_irq(struct vlapic *t, uint8_t vec, uint8_t trig)
 {
-    return vmx_vcpu_pend_interrupt(t->vcpu, vec);
+    return vmx_vlapic_set_irq(t->vcpu, vec, trig);
 }
 
 enum ioapic_irq_destination_types {